package com.wjw.rabbit.work.lunxun;

import com.rabbitmq.client.*;

import java.io.IOException;

/**
 * 轮询分发：消费者2
 * channel调用basicConsume消费时,参数二AutoAck改为true,(实际开发中不推荐这样，会造成死循环)
 */
public class Work2 {

    public static void main(String[] args) {
        //1.创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();
        //2.设置连接属性
        factory.setHost("127.0.0.1");//RabbitMQ服务的IP
        factory.setPort(5672);//端口
        factory.setUsername("admin");//RabbitMQ的用户
        factory.setPassword("admin");//RabbitMQ的密码
        factory.setVirtualHost("/");//虚拟访问节点

        Connection connection = null;
        Channel channel = null;
        try {
            //3.从工厂中获取连接
            connection = factory.newConnection("消费者-Work2");
            //4.从连接中获取通道
            channel = connection.createChannel();
            /**
             * 声明队列queue存储消息
             * 如果队列不存在,则会创建
             * 参数1:queue队列名称
             * 参数2：durable队列是否持久化
             * 参数3：exclusive是否排他，即是否私有，如果为true，会对当前队列加锁，其他通道不能访问，并且连接自动关闭
             * 参数4：autoDelete:是否自动删除，当最后一个消费者断开连接之后，是否自动删除消息
             * 参数5：arguments，可以设置队列附件参数，设置队列的有效期，消息的最大长度，队列的消息生命周期等
             */
            Channel finalChannel = channel;
            //finalChannel.basicQos(1);

            /**
             * basicConsume方法参数：
             * 参数一：队列名称:队列queue6：通过图形化界面创建了,未绑定交换机,所有它绑定的是默认交换机
             * 参数二：应答机制:AutoAck为ture自动应答,false手动应答,这里轮询分发使用ture。
             */
            finalChannel.basicConsume("queue6", true, new DeliverCallback() {
                //@Override
                public void handle(String s, Delivery delivery) throws IOException {
                try {
                    //System.out.println(delivery.getEnvelope().getDeliveryTag());
                    System.out.println("Work2收到的消息是："+new String(delivery.getBody(), "UTF-8"));
                    Thread.sleep(200);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                }
            }, new CancelCallback() {
                public void handle(String s) throws IOException {

                }
            });
            System.out.println("Work2开始接收消息");
            System.in.read();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            //7.关闭通道
            if(channel != null && channel.isOpen()){
                try {
                    channel.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            //8.关闭连接
            if(connection != null && connection.isOpen()){
                try {
                    connection.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }//finally
    }
}
